import {WPS_Enum,constEtEnum,Enum996CodeOfficeFlag} from "./enum.js"
import {
  getPluginStorageItem,
  GetDocParamsValue,
  pRemoveDocParam, sendWebNotify, fileInfoEnum,

} from "../common/common";
import {
  activeTab,
  showOATab,
  pCheckIs996CodeOffice,
  pIsOnlineOADoc, closeWpsIfNoDocument, pSetWPSAppUserName, pISOADocReadOnly,
} from "./etCommon.js"

import {CACHE_KEY, getNicknameWithUsername} from '@/hooks/web/useCache'

// 打印前监听事件
export const OnWorkbookBeforePrint = (doc)=> {
    return;
}

//切换窗口时触发的事件
export const OnWindowActivate = ()=> {
  try {
    showOATab(); // 根据文件是否为OA文件来显示OA菜单再进行刷新按钮
    setTimeout(activeTab, 2000); // 激活页面必须要页签显示出来，所以做1秒延迟
    return;
  }catch (e) {
    alert("ET事件执行失败："+e.message)
    alert(e.stack)
  }

}

// 当文件保存前触发的事件
export const OnWorkbookBeforeSave = (doc)=> {
  try {
    //设置变量，判断是否当前用户按了自定义的OA文件保存按钮
    if( wps.EtApplication().ActiveWorkbook
      &&
      doc.FullName==wps.EtApplication().ActiveWorkbook.FullName
    ){
      var l_IsOADocButtonSave = false;
      l_IsOADocButtonSave = getPluginStorageItem(constEtEnum.OADocUserSave);

      //根据传入参数判断当前文档是否能另存为，默认不能另存为
      if (pCheckCurrOADocCanSaveAs(doc) == false) { //先根据OA助手的默认设置判断是否允许OA文档另存为操作
        //0.如果配置文件：OA文档不允许另存为，则再判断
        //1.先判断是否是在线文档且是通过WPS自身按钮或快捷键保存，则取消弹出另存到本地的弹出框
        if (pIsOnlineOADoc(doc) == true) {
          alert("来自服务端的不落地文档，禁止另存为本地文档！");
          //如果是OA文档，则禁止另存为
          wps.ApiEvent.Cancel = true;
        }
        //2.如果是落地打开的OA文档并且通过WPS自身按钮或者快捷键保存，则执行保存到本地临时目录，取消弹出对话框
        if (pIsOnlineOADoc(doc) == false && l_IsOADocButtonSave == false){
          //用户手动另存为操作时，在这里被屏蔽掉
          doc.Save();
          //如果是OA文档，则禁止另存为
          wps.ApiEvent.Cancel = true;
        }
      }
      //保存文档后，也要刷新一下Ribbon按钮的状态
      showOATab();
    }else{
      wps.ApiEvent.Cancel=true;
    }
    return;
  }catch (e) {
    alert("ET事件执行失败："+e.message)
    alert(e.stack)
  }
}


//文档保存前关闭事件
/**
 * 作用：
 * @param {*} doc
 */
export const OnWorkbookBeforeClose = (doc)=> {
  try {
    var l_fullName = doc.FullName;
    var l_bIsOADoc = false;
    l_bIsOADoc = pCheckIs996CodeOffice(doc); //判断是否OA文档要关闭
    if (l_bIsOADoc == false) { // 非OA文档不做处理
      return;
    }
    //判断是否只读的文档，或受保护的文档，对于只读的文档，不给予保存提示
    if (pISOADocReadOnly(doc) == false) {
      if(GetDocParamsValue(doc,constEtEnum.isPrint) !== true) {
        if (doc.Saved == false) { //如果OA文档关闭前，有未保存的数据
          if (wps.confirm("系统文件有改动，是否提交后关闭？" + "\n" + "确认后请按上传按钮执行上传操作。取消则继续关闭文档。")) {
            wps.ApiEvent.Cancel = true;
            return;
          }
        }
      }
    }


    // 有未保存的数据，确认无需保存直接关闭
    doc.Close(wps.Enum&&wps.Enum.wdDoNotSaveChanges||0); // 不保存待定的更改。枚举值兼容性写法
    closeWpsIfNoDocument(); // 判断WPS中的文件个数是否为0，若为0则关闭WPS函数
    wps.FileSystem.Remove(l_fullName);

    OnDocumentAfterClose(doc)
  }catch (e) {
    alert("ET事件执行失败："+e.message)
    alert(e.stack)
  }

}


//文档保存后关闭事件
export const OnDocumentAfterClose = (doc)=> {
    var l_fullName = doc.FullName;

    // 告知web端关闭
    clearActiveEtId(doc)
    pRemoveDocParam(doc); // 关闭文档时，移除PluginStorage对象的参数
    pSetWPSAppUserName(); // 判断文档关闭后，如果系统已经没有打开的文档了，则设置回初始用户名
    closeWpsIfNoDocument()
    wps.FileSystem.Remove(l_fullName);
}
const clearActiveEtId = (doc)=>{
    let activeEtId = GetDocParamsValue(doc, constEtEnum.ActiveEtId);
    sendWebNotify("etClose",{
      [constEtEnum.ActiveEtId]:activeEtId,
    },
    doc);
}

//文档打开事件
export const OnWorkbookOpen = (doc)=> {
  try {
    //设置当前新增文档是否来自OA的文档
    OnWindowActivate();
    ChangeOATabOnDocOpen(); //打开文档后，默认打开Tab页
    setTimeout(activeTab,2000); // 激活OA助手菜单
  }catch (e) {
    alert("ET事件执行失败："+e.message)
    alert(e.stack)
  }

}

//新建文档事件
export const OnNewWorkbook = (doc)=> {
  try {
    ChangeOATabOnDocOpen(); // 打开OA助手Tab菜单页
    wps.ribbonUI.Invalidate(); // 刷新Ribbon按钮的状态
  }catch (e) {
    alert("ET事件执行失败："+e.message)
    alert(e.stack)
  }
}


/**
 *  作用：设置WPS程序文档的用户名
 */
export function SetWpsUserName() {
    // 当前登录用户
    var l_userName = getNicknameWithUsername();
    if (l_userName != "") {
        wps.EtApplication().UserName = l_userName;
        return;
    }
    //如果是非OA文件或者参数的值是空值，则按WPS安装默认用户名设置
    wps.EtApplication().UserName = getPluginStorageItem(constEtEnum.WPSInitUserName);
}



/*
    入口参数：doc
    功能说明：判断当前文档是否能另存为本地文件
    返回值：布尔值true or false
*/
function pCheckCurrOADocCanSaveAs(doc) {
    //如果是非OA文档，则允许另存为
    if (pCheckIs996CodeOffice(doc) == false) return true;

    //对于来自OA系统的文档，则获取该文档对应的属性参数
    var l_CanSaveAs = GetDocParamsValue(doc, constEtEnum.CanSaveAs);

    //判断OA传入的参数
    if (typeof (l_CanSaveAs) == "boolean") {
        return l_CanSaveAs;
    }
    return false;
}



/**
 * 作用：根据设置判断打开文件是否默认激活OA助手工具Tab菜单
 * 返回值：无
 */
function ChangeOATabOnDocOpen() {
    var l_ShowOATab = true; //默认打开
    l_ShowOATab = getPluginStorageItem(constEtEnum.Show996CodeTabDocActive);
    if (l_ShowOATab == true) {
        setTimeout(activeTab,500);
    }
}
